package main

const MOD = 1000000000 + 7

type Fancy struct {
	arr []int
	tim []int
	opr []bool
	opv []int
}

func Constructor() Fancy {
	return Fancy{
		arr: make([]int, 0, 5000),  // 存放值的列表
		tim: make([]int, 0, 5000),  // 用来 关联 opr列表 添加 值的时候 opr里面进行了多少操作
		opr: make([]bool, 0, 5000), // true: +  false: *
		opv: make([]int, 0, 5000),  // 存放 添加的值 + 还是 * 存放再 opr中
	}
}

func (this *Fancy) Append(val int) {
	this.arr = append(this.arr, val)
	this.tim = append(this.tim, len(this.opr))
}

func (this *Fancy) AddAll(inc int) {
	this.opr = append(this.opr, true)
	this.opv = append(this.opv, inc)
}

func (this *Fancy) MultAll(m int) {
	this.opr = append(this.opr, false)
	this.opv = append(this.opv, m)
}

func (this *Fancy) GetIndex(idx int) int {
	if len(this.arr) <= idx { // 超出索引 返回
		return -1
	}
	val := this.arr[idx]
	// i 是 opr 在 这个值前进行的操作数量 如果 添加值前操作数量小于 添加后 操作数量
	for i := this.tim[idx]; i < len(this.opv); i++ {

		if this.opr[i] {
			val += this.opv[i]
			val %= MOD
		} else {
			val *= this.opv[i]
			val %= MOD
		}
	}
	// 这是为了之后不再计算
	this.arr[idx] = val % MOD
	// 这里重置 他的操作
	this.tim[idx] = len(this.opv)
	return val
}
